home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 3.iso / dist / fw_qt3.idb / usr / freeware / Qt / examples / tablet / canvas.cpp.z / canvas.cpp
C/C++ Source or Header  |  2002-04-08  |  4KB  |  146 lines

  1. /****************************************************************************
  2. ** $Id:  qt/canvas.cpp   3.0.3   edited Oct 12 12:18 $
  3. **
  4. ** Copyright ( C ) 1992-2001 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. #include "canvas.h"
  12.  
  13. #include <qapplication.h>
  14. #include <qpainter.h>
  15. #include <qevent.h>
  16. #include <qrect.h>
  17.  
  18. const bool no_writing = FALSE;
  19.  
  20. Canvas::Canvas( QWidget *parent, const char *name, WFlags fl )
  21.     : QWidget( parent, name, WStaticContents | fl ), 
  22.       pen( Qt::red, 3 ), polyline(3),
  23.       mousePressed( FALSE ), oldPressure( 0 ), saveColor( red ),
  24.       buffer( width(), height() ) 
  25. {
  26.  
  27.     if ((qApp->argc() > 0) && !buffer.load(qApp->argv()[1]))
  28.     buffer.fill( colorGroup().base() );
  29.     setBackgroundMode( QWidget::PaletteBase );
  30. #ifndef QT_NO_CURSOR
  31.     setCursor( Qt::crossCursor );
  32. #endif
  33. }
  34.  
  35. void Canvas::save( const QString &filename, const QString &format )
  36. {
  37.     if ( !no_writing )
  38.     buffer.save( filename, format.upper() );
  39. }
  40.  
  41. void Canvas::clearScreen()
  42. {
  43.     buffer.fill( colorGroup().base() );
  44.     repaint( FALSE );
  45. }
  46.  
  47. void Canvas::mousePressEvent( QMouseEvent *e )
  48. {
  49.     mousePressed = TRUE;
  50.     polyline[2] = polyline[1] = polyline[0] = e->pos();
  51. }
  52.  
  53. void Canvas::mouseReleaseEvent( QMouseEvent * )
  54. {
  55.     mousePressed = FALSE;
  56. }
  57.  
  58. void Canvas::mouseMoveEvent( QMouseEvent *e )
  59. {
  60.     if ( mousePressed ) {
  61.     QPainter painter;
  62.     painter.begin( &buffer );
  63.     painter.setPen( pen );
  64.     polyline[2] = polyline[1];
  65.     polyline[1] = polyline[0];
  66.     polyline[0] = e->pos();
  67.     painter.drawPolyline( polyline );
  68.     painter.end();
  69.  
  70.     QRect r = polyline.boundingRect();
  71.     r = r.normalize();
  72.     r.setLeft( r.left() - penWidth() );
  73.     r.setTop( r.top() - penWidth() );
  74.     r.setRight( r.right() + penWidth() );
  75.     r.setBottom( r.bottom() + penWidth() );
  76.  
  77.     bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() );
  78.     }
  79. }
  80.  
  81. void Canvas::tabletEvent( QTabletEvent *e )
  82. {
  83.     e->accept();
  84.     // change the width based on range of pressure
  85.     if ( e->device() == QTabletEvent::Stylus )    {
  86.     if ( e->pressure() >= 0 && e->pressure() <= 32 )
  87.         pen.setColor( saveColor.light(175) );
  88.     else if ( e->pressure() > 32 && e->pressure() <= 64 )
  89.         pen.setColor( saveColor.light(150) );
  90.     else if ( e->pressure() > 64  && e->pressure() <= 96 )
  91.         pen.setColor( saveColor.light(125) );
  92.     else if ( e->pressure() > 96 && e->pressure() <= 128 )
  93.         pen.setColor( saveColor );
  94.     else if ( e->pressure() > 128 && e->pressure() <= 160 )
  95.         pen.setColor( saveColor.dark(150) );
  96.     else if ( e->pressure() > 160 && e->pressure() <= 192 )
  97.         pen.setColor( saveColor.dark(200) );
  98.     else if ( e->pressure() > 192 && e->pressure() <= 224 )
  99.         pen.setColor( saveColor.dark(250) );
  100.     else // pressure > 224
  101.         pen.setColor( saveColor.dark(300) );
  102.     } else if ( e->device() == QTabletEvent::Eraser
  103.         && pen.color() != backgroundColor() ) {
  104.     pen.setColor( backgroundColor() );
  105.     }
  106.  
  107.     int xt = e->xTilt();
  108.     int yt = e->yTilt();
  109.     if ( ( xt > -15 && xt < 15 ) && ( yt > -15 && yt < 15 ) )
  110.     pen.setWidth( 3 );
  111.     else if ( ((xt < -15 && xt > -30) || (xt > 15 && xt < 30)) &&
  112.           ((yt < -15 && yt > -30) || (yt > 15 && yt < 30 )) )
  113.     pen.setWidth( 6 );
  114.     else if ( ((xt < -30 && xt > -45) || (xt > 30 && xt < 45)) &&
  115.           ((yt < -30 && yt > -45) || (yt > 30 && yt < 45)) )
  116.     pen.setWidth( 9 );
  117.     else if (  (xt < -45 || xt > 45 ) && ( yt < -45 || yt > 45 ) )
  118.     pen.setWidth( 12 );    
  119. }
  120.  
  121. void Canvas::resizeEvent( QResizeEvent *e )
  122. {
  123.     QWidget::resizeEvent( e );
  124.  
  125.     int w = width() > buffer.width() ?
  126.         width() : buffer.width();
  127.     int h = height() > buffer.height() ?
  128.         height() : buffer.height();
  129.  
  130.     QPixmap tmp( buffer );
  131.     buffer.resize( w, h );
  132.     buffer.fill( colorGroup().base() );
  133.     bitBlt( &buffer, 0, 0, &tmp, 0, 0, tmp.width(), tmp.height() );
  134. }
  135.  
  136. void Canvas::paintEvent( QPaintEvent *e )
  137. {
  138.     QWidget::paintEvent( e );
  139.  
  140.     QMemArray<QRect> rects = e->region().rects();
  141.     for ( uint i = 0; i < rects.count(); i++ ) {
  142.     QRect r = rects[(int)i];
  143.     bitBlt( this, r.x(), r.y(), &buffer, r.x(), r.y(), r.width(), r.height() );
  144.     }
  145. }
  146.